<?php

declare(strict_types=1);

namespace App\Helpers;

/**
 * Manejo de tokens contra ataques CSRF.
 */
class CSRF
{
    private const LENGTH_BYTES = 32;

    private const ALGORITHM = 'sha256';

    private const SESSION_VARNAME = 'csrf_token';

    /**
     * Genera una llave de cifrado para el token.
     */
    private static function generateKey(): string
    {
        return bin2hex(random_bytes(self::LENGTH_BYTES));
    }

    /**
     * Obtiene el nombre de la variable de la sesión.
     */
    public static function getSessionVarname(): string
    {
        return self::SESSION_VARNAME;
    }

    /**
     * Obtiene el nombre de la variable.
     */
    public static function getVarname(): string
    {
        return self::getSessionVarname();
    }

    /**
     * Genera un token con la llave de cifrado.
     */
    public static function generateToken(string $data): string
    {
        return hash_hmac(self::ALGORITHM, $data, self::generateKey());
    }

    /**
     * Comprueba la autenticación de un token.
     */
    public static function verify(string $token, string $test): bool
    {
        return hash_equals($token, $test);
    }
}
